home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / web / noweb / src / icon / disambiguate.icn < prev    next >
Text File  |  1995-02-24  |  1KB  |  56 lines

  1. #line 7 "disambiguate.nw"
  2. global chunknames
  3.  
  4. procedure remember(name)
  5.   initial chunknames := table()
  6.   if *name = 0 then fail
  7.   /chunknames[name[1]] := set()
  8.   insert(chunknames[name[1]], name)
  9.   return
  10. end
  11. #line 20 "disambiguate.nw"
  12. procedure disambiguate(arg)
  13.   local s
  14.   if *arg = 0 then fail
  15.   search := chunknames[arg[1]]
  16.   if /search then stop("Can't resolve ", arg, "...")
  17.   every match(arg, n := !search) do 
  18.     if /s then s := n
  19.     else stop("Ambiguous abbreviation: <<", arg, "...>> could denote\n\t<<",
  20.               s, ">> or\n\t<<", n, ">>")
  21.   if *s = 0 then stop("Can't resolve ", arg, "...")
  22.   return s
  23. end
  24. #line 35 "disambiguate.nw"
  25. global lines, defns, uses, names, firstdefnout
  26.  
  27. procedure main(args)
  28.   lines := []
  29.   while put(lines, line := read()) do
  30.     apply(pass1, line)
  31.   every apply(pass2, !lines)
  32. end
  33.  
  34. procedure apply(pass, line)
  35.     line ? (="@" & pass(tab(upto(' ')|0),  if =" " then tab(0) else &null))
  36. end
  37.  
  38. procedure pass1(name, chunkname)
  39.   initial chunknames := set()
  40.   case name of {
  41.     "defn" | "use" : 
  42.       if chunkname[0-:3] ~== "..." then remember(chunkname)
  43.   }
  44.   return
  45. end
  46.  
  47. procedure pass2(name, arg)
  48.   case name of {
  49.     "defn" | "use" : 
  50.         if arg[0:-3] == "..." then arg := disambiguate(arg[1:-3])
  51.   }
  52.   write("@", name, (" " || \arg) | "")
  53.   return
  54. end
  55.  
  56.